<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>正则表达式语法 | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'regexp-syntax.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/regexp-syntax.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/regexp-syntax.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/regexp-syntax.html" rel="nofollow" target="_blank">../en/regexp-syntax.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch 权威指南 [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="query-dsl.html">查询领域特定语言(Query DSL)</a></span>
»
<span class="breadcrumb-node">正则表达式语法</span>
</div>
<div class="navheader">
<span class="prev">
<a href="query-dsl-multi-term-rewrite.html">« <code class="literal">rewrite</code> 参数</a>
</span>
<span class="next">
<!--<a href="xpack-sql.html">SQL access »</a>-->
<a href="search-aggregations.html">聚合 »</a>
</span>
</div>
<div class="chapter">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="regexp-syntax"></a>正则表达式语法
</h2>
</div></div></div>
<p>
<a href="https://en.wikipedia.org/wiki/Regular_expression" class="ulink" target="_top">正则表达式</a>是一种使用占位符(称为运算符)来匹配数据模式的方法。
</p>
<p>Elasticsearch支持在以下查询中使用正则表达式：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<a class="xref" href="query-dsl-regexp-query.html" title="Regexp query"><code class="literal">regexp</code></a>
</li>
<li class="listitem">
<a class="xref" href="query-dsl-query-string-query.html" title="Query string query"><code class="literal">query_string</code></a>
</li>
</ul>
</div>
<p>
Elasticsearch 使用 <a href="https://lucene.apache.org/core/" class="ulink" target="_top">Apache Lucene</a> 的正则表达式引擎来解析这些查询。
</p>
<h3>
<a id="regexp-reserved-characters"></a>保留字符
</h3>
<p>Lucene 的正则表达式引擎支持所有 Unicode 字符。但是，以下字符被保留作为运算符：</p>
<pre class="literallayout">. ? + * | { } [ ] ( ) " \</pre>

<p>
根据所启用的 <a class="xref" href="regexp-syntax.html#regexp-optional-operators" title="Optional operators">可选运算符</a>，以下字符也会被保留：
</p>
<pre class="literallayout"># @ &amp; &lt; &gt;  ~</pre>

<p>
要按字面意思使用其中一个字符，请在前面加一个反斜杠对其进行转义，或者用双引号将其括起来。例如:
</p>
<pre class="literallayout">\@                  # renders as a literal '@'
\\                  # renders as a literal '\'
"john@smith.com"    # renders as 'john@smith.com'</pre>

<h3>
<a id="regexp-standard-operators"></a>标准运算符
</h3>
<p>
Lucene 的正则表达式引擎不使用 <a href="https://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions" class="ulink" target="_top">Perl兼容的正则表达式(PCRE)</a> 库，但是它支持以下标准运算符。
</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">.</code>
</span>
</dt>
<dd>
<p>
匹配任何字符。例如：
</p>
<pre class="literallayout">ab.     # 匹配 'aba'、'abb'、'abz' 等</pre>

</dd>
<dt>
<span class="term">
<code class="literal">?</code>
</span>
</dt>
<dd>
<p>
重复前面的字符零次或一次。通常用于使前面的字符可选。例如：
</p>
<pre class="literallayout">abc?     # 匹配 'ab' 和 'abc'</pre>

</dd>
<dt>
<span class="term">
<code class="literal">+</code>
</span>
</dt>
<dd>
<p>
重复前面的字符一次或多次。例如：
</p>
<pre class="literallayout">ab+     # 匹配 'ab'、'abb'、'abbb' 等</pre>

</dd>
<dt>
<span class="term">
<code class="literal">*</code>
</span>
</dt>
<dd>
<p>重复前面的字符零次或多次。例如：</p>
<pre class="literallayout">ab*     # 匹配 'a'、'ab'、'abb'、'abbb' 等</pre>

</dd>
<dt>
<span class="term">
<code class="literal">{}</code>
</span>
</dt>
<dd>
<p>
前面的字符可以重复的最小和最大次数。例如：
</p>
<pre class="literallayout">a{2}    # 匹配 'aa'
a{2,4}  # 匹配 'aa'、'aaa' 和 'aaaa'
a{2,}   # 匹配 'a' 重复2次或更多次</pre>

</dd>
<dt>
<span class="term">
<code class="literal">|</code>
</span>
</dt>
<dd>
<p>
或(OR) 运算符。如果左侧或右侧的最长模式匹配，则匹配成功。例如:
</p>
<pre class="literallayout">abc|xyz  # 匹配 'abc' 和 'xyz'</pre>

</dd>
<dt>
<span class="term">
<code class="literal">( … )</code>
</span>
</dt>
<dd>
<p>
形成一个分组。可以使用分组将表达式的一部分视为单个字符。例如：
</p>
<pre class="literallayout">abc(def)?  # 匹配 'abc' 和 'abcdef'，但不匹配 'abcd'</pre>

</dd>
<dt>
<span class="term">
<code class="literal">[ … ]</code>
</span>
</dt>
<dd>
<p>匹配括号中的一个字符。例如：</p>
<pre class="literallayout">[abc]   # 匹配 'a', 'b', 'c'</pre>

<p>
在括号内，<code class="literal">-</code> 表示一个范围，除非 <code class="literal">-</code> 是第一个字符或被转义了。例如：
</p>
<pre class="literallayout">[a-c]   # 匹配 'a'、'b' 或 'c'
[-abc]  # '-' 是第一个字符，匹配 '-'、'a'、'b' 或 'c'
[abc\-] # 转义'-'，匹配 'a'、'b'、'c' 或 '-'</pre>

<p>
方括号中字符前的 <code class="literal">^</code> 否定该字符或范围。例如：
</p>
<pre class="literallayout">[^abc]      # 匹配除了 'a'、'b'、'c' 的任意字符
[^a-c]      # 匹配除了 'a'、'b'、'c' 的任意字符
[^-abc]     # 匹配除了 '-'、'a'、'b'、'c' 的任意字符
[^abc\-]    # 匹配除了 'a'、'b'、'c'、'-' 的任意字符
</pre>

</dd>
</dl>
</div>
<h3>
<a id="regexp-optional-operators"></a>可选的运算符
</h3>
<p>
可以使用 <code class="literal">flags</code> 参数为 Lucene 的正则表达式引擎启用更多可选的运算符。
</p>
<p>
要启用多个运算符，请使用 <code class="literal">|</code> 分隔符。

例如，<code class="literal">flags</code> 值为<code class="literal">COMPLEMENT|INTERVAL</code> 表示启用 <code class="literal">COMPLEMENT</code> 和 <code class="literal">INTERVAL</code> 运算符。
</p>
<h4>
<a id="_valid_values"></a>有效值
</h4>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">ALL</code> (默认)
</span>
</dt>
<dd>
启用所有可选的运算符。
</dd>
<dt>
<span class="term">
<code class="literal">COMPLEMENT</code>
</span>
</dt>
<dd>
<p>
启用 <code class="literal">~</code> 运算符。

可以用 <code class="literal">~</code> 来否定最短的跟随模式。例如:
</p>
<pre class="literallayout">a~bc   # 匹配 'adc' 和 'aec'，但不匹配 'abc'</pre>

</dd>
<dt>
<span class="term">
<code class="literal">INTERVAL</code>
</span>
</dt>
<dd>
<p>
启用 <code class="literal">&lt;&gt;</code> 运算符。

可以使用 <code class="literal">&lt;&gt;</code> 来匹配数值范围。例如:
</p>
<pre class="literallayout">foo&lt;1-100&gt;      # 匹配 'foo1', 'foo2' ... 'foo99', 'foo100'
foo&lt;01-100&gt;     # 匹配 'foo01', 'foo02' ... 'foo99', 'foo100'</pre>

</dd>
<dt>
<span class="term">
<code class="literal">INTERSECTION</code>
</span>
</dt>
<dd>
<p>
启用 <code class="literal">&amp;</code> 运算符，它充当 与(AND) 运算符。

如果左侧和右侧的模式都匹配，则匹配成功。例如:
</p>
<pre class="literallayout">aaa.+&amp;.+bbb  # 匹配 'aaabbb'</pre>

</dd>
<dt>
<span class="term">
<code class="literal">ANYSTRING</code>
</span>
</dt>
<dd>
<p>
启用 <code class="literal">@</code> 运算符。

可以使用 <code class="literal">@</code> 来匹配任何完整的字符串。
</p>
<p>
可以将 <code class="literal">@</code> 运算符与 <code class="literal">&amp;</code> 和 <code class="literal">~</code> 运算符结合起来创建一个“除此之外的一切”逻辑。例如:
</p>
<pre class="literallayout">@&amp;~(abc.+)  # 匹配除了 'abc' 开头的一切</pre>

</dd>
</dl>
</div>
<h3>
<a id="regexp-unsupported-operators"></a>不支持的运算符
</h3>
<p>
Lucene 的正则表达式引擎不支持定位符，比如 <code class="literal">^</code>(行首)或 <code class="literal">$</code> (行尾)。

要匹配某个词项，正则表达式必须匹配整个字符串。
</p>
</div>
<div class="navfooter">
<span class="prev">
<a href="query-dsl-multi-term-rewrite.html">« <code class="literal">rewrite</code> 参数</a>
</span>
<span class="next">
<!--<a href="xpack-sql.html">SQL access »</a>-->
<a href="search-aggregations.html">聚合 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>